package prirprojekt;

import java.util.ArrayList;
import java.util.Collections;

public class PermutacjaZadan implements Comparable {

    Zadanie[] tablicaZadan;

    public PermutacjaZadan(Zadanie[] tablicaZadan) {
        this.tablicaZadan = tablicaZadan;
    }
    
    public PermutacjaZadan(int ileZadan, int ileCPU){
        this.tablicaZadan = new Zadanie[ileZadan];
        for(int i = 0; i < ileZadan; i++){
            this.tablicaZadan[i] = new Zadanie(i, ileCPU);
//            System.out.print("Z" + this.tablicaZadan[i].id + "=>"+this.tablicaZadan.toString()+"\n");
//            System.out.println(this.tablicaZadan[i].toString());
        }
    }

    public int jakosc() {
        int nCPU = tablicaZadan[0].czasyNaCPU.length;
        int nZadan = tablicaZadan.length;
        int[][] czasyZakonczenia = new int[nCPU][nZadan];
        for (int i = 0; i < nCPU; i++) {
            for (int j = 0; j < nZadan; j++) {
                if (i == 0) {
                    if (j == 0) {
                        czasyZakonczenia[i][j] = tablicaZadan[j].czasyNaCPU[i];
                    } else {
                        czasyZakonczenia[i][j] = czasyZakonczenia[i][j - 1] + tablicaZadan[j].czasyNaCPU[i];
                    }
                } else {
                    if (j == 0) {
                        czasyZakonczenia[i][j] = czasyZakonczenia[i - 1][j] + tablicaZadan[j].czasyNaCPU[i];
                    } else {
                        czasyZakonczenia[i][j] = Math.max(czasyZakonczenia[i - 1][j], czasyZakonczenia[i][j - 1]) + tablicaZadan[j].czasyNaCPU[i];
                    }
                }
                //System.out.println("Czas zakonczenia zadania " + (j+1) + " na procesorze " + (i+1) + " = " + czasyZakonczenia[i][j]);
            }
        }
        return czasyZakonczenia[nCPU - 1][nZadan - 1];
    }

    public PermutacjaZadan mutuj() {
        int i1, i2;
        i1 = (int) (Math.random() * tablicaZadan.length);
        i2 = (int) (Math.random() * tablicaZadan.length);
        while (i1 == i2) {
            i2 = (int) (Math.random() * tablicaZadan.length);
        }
        Zadanie[] nowaTablicaZadan = new Zadanie[tablicaZadan.length];
        for (int i = 0; i < tablicaZadan.length; i++) {
            if (i == i1) {
                nowaTablicaZadan[i] = tablicaZadan[i2];
            } else if (i == i2) {
                nowaTablicaZadan[i] = tablicaZadan[i1];
            } else {
                nowaTablicaZadan[i] = tablicaZadan[i];
            }
        }
        
        return new PermutacjaZadan(nowaTablicaZadan);
    }

    public PermutacjaZadan losuj() {
        ArrayList<Integer> indeksy = new ArrayList<>();
        Zadanie[] nowaTablicaZadan = new Zadanie[tablicaZadan.length];
        for (int i = 0; i < tablicaZadan.length; i++) {
            indeksy.add(i);
        }
        Collections.shuffle(indeksy);
        for (int i = 0; i < tablicaZadan.length; i++) {
            nowaTablicaZadan[i] = tablicaZadan[indeksy.get(i)];
        }
        return new PermutacjaZadan(nowaTablicaZadan);
    }

    @Override
    public String toString() {
        String wynik = "";
        for (int i = 0; i < tablicaZadan.length; i++) {
            wynik += tablicaZadan[i].id + ", ";
        }
        wynik += " : jakosc " + this.jakosc();
        return wynik;
    }

    @Override
    public int compareTo(Object o) {
        if (o instanceof PermutacjaZadan) {
            PermutacjaZadan p = (PermutacjaZadan) o;
            return p.jakosc() - this.jakosc();
        } else {
            return 0;
        }
    }
}
